package com.dbms.common;

/**
 * `Position` 类用于表示一个词法单元（Token）或错误在原始输入字符串中的具体位置。
 * 它包含了行号、列号以及在整个字符串中的起止索引，这对于生成精确的错误提示非常有用。
 */
public class Position {
    private final int line;       // 所在行号
    private final int column;     // 所在列号
    private final int startIndex; // 在整个输入字符串中的起始索引
    private int endIndex;         // 在整个输入字符串中的结束索引

    /**
     * Position 的构造函数。
     * @param line        起始行号。
     * @param column      起始列号。
     * @param startIndex  在整个字符串中的起始索引。
     */
    public Position(int line, int column, int startIndex) {
        this.line = line;
        this.column = column;
        this.startIndex = startIndex;
        this.endIndex = startIndex; // 默认情况下，结束索引与起始索引相同（表示单个字符的位置）
    }

    // --- Getter 和 Setter 方法 ---

    public int getLine() { return line; }
    public int getColumn() { return column; }
    public int getStartIndex() { return startIndex; }
    public int getEndIndex() { return endIndex; }

    /**
     * 设置结束索引。当一个词法单元包含多个字符时，词法分析器会调用此方法来更新其范围。
     * @param endIndex 结束索引。
     */
    public void setEndIndex(int endIndex) { this.endIndex = endIndex; }

    /**
     * 重写 toString 方法，提供一个用户友好的位置描述。
     * @return 格式化的位置字符串, e.g., "行: 1, 列: 8"。
     */
    @Override
    public String toString() {
        return "行: " + line + ", 列: " + column;
    }
}